package org.example.study5;

/**
 * 演示多线程通信的可见性问题解决方案
 * 创建两个线程：
 * 1. 第一个线程持续执行任务直到收到停止信号
 * 2. 第二个线程接收用户输入来发送停止信号
 */
import java.util.Scanner;

public class Demo_503 {
    // 使用volatile修饰的共享变量（关键改进点）
    static volatile int flag = 0; // 保证可见性，确保修改立即对其他线程可见

    public static void main(String[] args) {
        // 工作线程（持续检测停止信号）
        Thread t1 = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "线程启动.");
            // 通过volatile变量实现无锁循环检测
            while (flag == 0) {
                // 空循环（实际开发中应添加业务逻辑或休眠）
                // 由于volatile保证可见性，此处能及时获取flag最新值
            }
            System.out.println(Thread.currentThread().getName() + "线程退出.");
        }, "t1");
        t1.start(); // 启动工作线程

        // 控制线程（接收用户输入）
        Thread t2 = new Thread(() -> {
            System.out.println(Thread.currentThread().getName() + "线程启动.");
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入一个非零的整数：");
            // 修改volatile变量（自动触发可见性机制）
            flag = scanner.nextInt(); // 原子操作，单次写入int是线程安全的
            System.out.println(Thread.currentThread().getName() + "线程退出.");
        }, "t2");
        t2.start(); // 启动控制线程
    }
}

/*运行：
t1线程启动.
t2线程启动.
请输入一个非零的整数：
5
t1线程退出.
t2线程退出.
*/